#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QModbusDataUnit>
#include "settingsdialog.h"
#include <QLabel>

enum ModbusConnection {
    Serial,
    Tcp
};

QT_BEGIN_NAMESPACE

class QModbusClient;
class QModbusReply;

namespace Ui { 
class MainWindow; 
class SettingsDialog;
}

QT_END_NAMESPACE

#pragma pack(push,1)  // 字节对齐
union InputReg // 只读
{
    struct
    {
        qint16 temperature;// 测量到的温度
        qint8 internal_ambient;// 传感器内部温度
        qint64  secsSinceEpoch;     //<1> UTC时间
        bool    state;    //<2> 定位状态，A=有效定位，V=无效定位
        float  latitude;  //<3> 纬度ddmm.mmmm（度分）格式（前面的0也将被传输） 3115.6422
        float  longitude;   //<5> 经度dddmm.mmmm（度分）格式（前面的0也将被传输） 12127.5490
        float  speed;   //<7> 地面速率（000.0~999.9节，前面的0也将被传输） 0.58
        float  course;  //<8> 地面航向（000.0~359.9度，以真北为参考基准，前面的0也将被传输） 98.86
        char identify_unit[6];// 传感器型号
        char sensor_sn[10];// 传感器序列号。Xnnnnnn
    } param;
    char byte1[44];
    quint16 byte2[22];
};
union HoldReg // 读写
{
    struct
    {
        qint16 car_speed;  // 速度 0-1024
        qint8 display_mode_mr;// 单、双色工作模式。1 OR 2;
        qint8 attenaution;// 衰减。nn 0-99%;
        float emissisity;// 发射率，1C模式需要设置。0.10..1.00;
        float slope;// 坡度，2C模式需要设置。0.850..1.150;
        float peak_hold_time;// 峰值保持时间。nnn.n  0..299.9;
        char temp_units;// 温度单位（摄氏/华氏）。C OR F;
        char poll_burst_mode;// 传输模式B/P
    } param;
    char byte1[18];
    quint16 byte2[9];
};
#pragma pack(pop)  // 字节对齐END

//class SettingsDialog;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    InputReg iReg;
    HoldReg  hReg;

    void connectSlave(ModbusConnection t); // 连接从机
    void readMaster(int regType, int startAddress, int readSize);
    void readWriteMaster(int regType, int startAddress, int readSize);
    void initActions();
private:
    Ui::MainWindow *ui;
    SettingsDialog *m_settingsDialog = nullptr;
    QModbusClient *modbusDevice = nullptr;
    QLabel *ComStatic, *ClockStatic, *ledLabel;
    QTimer *clocktime;

    QModbusDataUnit readRequest(int type, int startAddress, int readSize) const;
    QModbusDataUnit writeRequest(int type, int startAddress, int readSize) const;

private slots:
    void onModbusStateChanged(int state);
    void onReadReady();
    void on_actionConnect_triggered();
};
#endif // MAINWINDOW_H
